home *** CD-ROM | disk | FTP | other *** search
- ; ***************************************
- ; Beispielmodul für TwiLight in Assembler.
- ; Kann als Grundbaustein für eigene Module genutzt werden.
- ;
- ; Geschrieben mit dem TurboAss von Σ-Soft.
- ; Wenn die Assembler-Direktiven "(END)PART", "DEFAULT" und "OUTPUT"
- ; entfernt werden, müsste sich das Modul mit allen Assemblern
- ; übersetzen lassen.
- ;
- ; Delirium Arts '93
- ;
-
-
-
- OUTPUT 'C:\TLM\DEMO.TLM' ; Modul wird in den Ordner TLM als DEMO.TLM gespeichert
- DEFAULT 5 ; Ausgabe mit Fastload-Bit (dieses wird aber von TwiLight sowieso ignoriert)
-
- >PART 'ACC-Struktur-EQUs'
- _tl_version EQU 0 ; die infos, die das ACC liefert...
- _tl_handle EQU 2 ; siehe Doku!
- _max_x EQU 4 ; maximale Bildschirmkoordinaten
- _max_y EQU 6
- _vscr_x EQU 8 ; sichtbarer Bildschirmausschnitt
- _vscr_y EQU 10 ; besser vscr_... verwenden!
- _vscr_w EQU 12
- _vscr_h EQU 14
- _max_colors EQU 16 ; maximale Farbanzahl
- _palette EQU 18 ; aus welcher Palette
- _planes EQU 20 ; Anzahl der Farbplanes
- _raster_op EQU 22 ; Anzahl der Rasterops/sek
- _cpu EQU 24 ; Prozessor-cookie
- _fpu EQU 28 ; Coprotz
- _mch EQU 32 ; Maschinencookie
- _snd EQU 36 ; Soundcookie
- _tl_screen_flag EQU 40 ; Zeiger auf Flag, ob noch geschont werden soll (nur wenn bit 12 in tlm_flags gesetzt!)
- _tl_path EQU 44 ; Zeiger auf den \TLM\ Ordner (nullterminiert)
- _tl_screen_adr EQU 48 ; Adresse des (evntl.) gesicherten Bildschirms
- _tl_mem EQU 52 ; die mit tlm_mem_request angeforderte Speicher
- _tl_aes_global EQU 56 ; Die AES-Kennung, bei jedem AES aufruf sollte sie benutzt werden.
- _tl_vdi_pb EQU 60 ; Zeiger auf den VDI-Parameterblock von TwiLight. Eigentlich unnötig
- _tl_flags EQU 64 ; Flags
- _tl_check EQU 66 ; Die tl_check() routine
- _tl_dim_col EQU 70 ; dunkelt Farben ab
- _tl_mod_time EQU 74 ; liefert Zeit seit Modulstart
- _tl_set_col EQU 78 ; Setzt bestimmte anzahl von VDI Farben
- _tl_scrn_restore EQU 82 ; Routine restauriert auf Wunsch den Bildschirm
- _tl_wait EQU 86 ; Wartet bestimmte Zeit
- _tl_snd_play EQU 90 ; Spielt Digi-Sound
- _tl_snd_stop EQU 94 ; Stopt Digi-Sound
- _tl_paula EQU 98 ; Spielt Sound mit PAULA.ACC
- _tl_reserved2 EQU 102
- _tl_play_mouse EQU 110 ; Übergibt die Mauskontrolle an das Modul
- _tl_scroll EQU 114 ; Zeigt Scrolline an
- _tl_xset_col EQU 118 ; Setzt VDI-Farben in abhängigkeit vom Pixelmuster
- _tl_dither EQU 122 ; Rastert ein farbiges Sprite für Schwarz-Weiß
- _tl_sprite_init EQU 126 ; Initialisiert die Spriteroutine
- _tl_sprite EQU 130 ; Zeichnet ein Sprite
-
-
- RAHMEN EQU 0 ; Die EQUs der Modulobjekte
- STRING EQU 1
- BUTTON EQU 2
- RADIO EQU 3
- POPUP EQU 4
- SLIDER EQU 5
- ICON EQU 6
- EX_BUTTON EQU 10
- POPUP_2 EQU 11
- FREI EQU 12
-
-
-
-
- ENDPART
- >PART 'Modulkopf'
-
- bra modulstart ; muß ein 4-Byte-Sprung sein!
-
- tlm_macic: DC.B "XTLM" ; Magic
- tlm_version: DC.W $0001 ; Version des Moduls: 0.1
- tlm_min_acc: DC.W 0 ; läuft auf allen TwiLight-Versionen
- tlm_name: DC.B 'Demomodul ' ; Modulname (24 Zeichen)
- tlm_author: DC.B 'Delirium Arts ' ; Name des Programmierers
- tlm_icon: DC.L %11111111111111111111111111111111
- DC.L %11111111111111111111111111111111
- DC.L %11111111111111111111111111111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
-
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100001111111111100000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111100000000000000000000111111
- DC.L %11111111111111111111111111111111
- DC.L %11111111111111111111111111111111
- DC.L %11111111111111111111111111111111
-
- tlm_mem_req: DC.L 0 ; Speicheranforderung... Das Modul braucht keinen zusätzlichen Speicher
- tlm_flags: DC.W %0000000000111111 ; Flags
- ; ||| |||||||
- ; ||| ||||||+ Verändert Bildschirminhalt
- ; ||| |||||+- Verändert Farben
- ; ||| ||||+-- Modul benötigt VSYNCs
- ; ||| |||+--- Maus soll ausgeschaltet werden
- ; ||| ||+---- TwiLight soll den Schirm abdunkeln
- ; ||| |+----- TwiLight soll den Schirm löschen
- ; ||| +------ Modul benötigt die Spriteroutine
- ; |||
- ; ||+-------- Benötigt mindestens MC68020
- ; |+--------- Benötigt einen mathematischen Coproz.
- ; +---------- Modul benötigt DMA Sound
-
- tlm_konfig: DC.L objekte ; Zeiger auf den Modulkonfigblock
-
- ; Die folgenden Objekte können irgendwo im Modul stehen
- ; Hier stehen sie direkt nach dem Modulkopf.
-
-
- objekte: DC.W ob_ende-objekte ; Länge des Objektblocks
- DC.L 0
- DC.L infotext
- DC.W 4 ; Es gibt 4 verschiedene Objekte (Knöpfe, Popup etc)
- DC.L _slider
- DC.L _rahmen
- DC.L _button
- DC.L _radio
-
-
- _slider: DC.W SLIDER ; Dieses Objekt ist ein Slider
- DC.W %0000000000000011 ; Der Slider ist horizontal und ist Tastaturbedienbar
- DC.L slider_routine ; diese Routine wird bei jeder Bewegung des Sliders aufgerufen
- w_slider: DC.W 1 ; Die Aktuelle Einstellung des Sliders
- DC.W 1,1 ; Position
- DC.W 28 ; breite
- DC.W 10 ; 10 Elemente
- DC.W 1 ; Stepweite ist 1
- DC.W 1 ; kleinstes Element
- DC.W 10 ; größtes Element
- DC.L sl_mask ; Zeiger auf Slidermaske
- DC.L sl_text ; Zeiger auf den Slidertext
-
- sl_mask: DC.B "__ Objekte",0 ; Die Maske im Slider
- sl_text: DC.B " ",0 ; hier muß soviel Platz sein, wie der Text im Slider lang sein kann
- EVEN
-
-
-
-
- _button: DC.W BUTTON ; es soll ein Button sein
- DC.W 0 ; Flags, es ist ein Button mit Kästchen davor
- DC.L 0 ; optionale Routine (fehlt hier)
- w_button: DC.W 0 ; der Status des Button 0-> nicht selectiert, -1 -> selectiert
- DC.W 1 ; x-Position
- DC.W 13 ; y-Position
- DC.L button_txt ; Zeiger auf den Buttonstring
-
- button_txt: DC.B ' [Drück mich ',0
- EVEN
-
-
-
-
-
- _radio: DC.W RADIO
- DC.W 0 ; Flags: Es sollen Runde Knöpfe sein
- DC.L 0 ; optionale Routine
- w_radio: DC.W 1 ; Nr. des selectierten Knopfs
- DC.W 1,3 ; Position des Radioknopfs
- DC.W 0 ; Abstand 2er Knöpfe in x-Richtung
- DC.W 2 ; Abstand in y-Richtung zweier Knöpfe
- DC.W 3 ; 3 Knöpfe gibt's
- DC.L radio_txt1 ; Zeiger auf die 3 Einträge
- DC.L radio_txt2
- DC.L radio_txt3
-
- radio_txt1: DC.B '[Knopf 1',0 ; die Knöpfe
- radio_txt2: DC.B 'K[nopf 2',0
- radio_txt3: DC.B 'Kn[opf 3',0
- EVEN
-
-
-
-
-
- _rahmen: DC.W RAHMEN ; Ein Rahmen
- DC.W 0,9 ; Position des Rahmens
- DC.W 32,3 ; Breite und Höhe
- DC.L rahmen_txt ; Der Text im Kopf des Rahmens
- DC.W 1 ; der Rahmen hat 1 Unterobjekt
- DC.L _popup
- rahmen_txt: DC.B ' Überschrift ',0
- EVEN
-
-
- _popup: DC.W POPUP ; Ein Popup
- DC.W 0 ; Flags. Ein Normales Popup
- DC.L 0 ; keine Routine
- w_popup: DC.W 1 ; der erste Knopf ist selectiert
- DC.W 2,1 ; Position des Popups
- DC.L pop_txt1 ; Zeiger auf den Titel des Popups
- DC.W 3 ; Popup hat 3 Einträge
- DC.L pop_txt2 ; Zeiger auf die Popuptexte
-
- pop_txt1: DC.B '[Popup: ',0
-
- pop_txt2: DC.B ' Eintrag 1 ',0 ; Die 3 Popupeinträge
- DC.B ' Eintrag 2 ',0
- DC.B ' Eintrag 3 ',0
- EVEN
-
- ob_ende: DC.L -1 ; Endflag
-
- ; Der Infotext:
- ; Jede Zeile muß mit einem CR (13) abgeschlossen sein. Zwei oder mehrere
- ; CRs hintereinander bedeuten Leerzeilen.
- ; Die letzte Zeile muß mit 13,0 aufhören.
-
- infotext: DC.B 'DEMO-Modul',13,13
- DC.B 'Dies ist lediglich ein,',13
- DC.B 'Beispielmodul in Assembler.',13,13
- DC.B 'Sollte es Ihr Lieblingsmodul werden,',13
- DC.B 'schreiben Sie uns bitte.',13
- DC.B 'Wir werden uns dann ärgern,',13
- DC.B 'warum wir nicht nur',13
- DC.B 'solch billige Module geschrieben haben...',13,0
-
- EVEN
-
-
- slider_routine: cmpi.w #1,w_slider ; Ist es nur noch '1 Objekt'
- bne.s mehr_objekte
- move.b #" ",sl_text+8 ; In Text das 'e' von 'Objekte' löschen
- mehr_objekte: rts
-
- ENDPART
-
- ;-------------- MODUL ----------------------------------
-
- >PART 'Das Modul'
- ; Hier kommt das eigentliche Modul.
- ; Das Modul sollte regelmäßig tl_check() aufrufen, um zu erfahren, ob noch weitergeschont werden soll.
- ; Das folgende Beispielmodul macht eigentlich nichts.
- ; Es testet einmal mit tl_check, ob noch geschont werden soll,
- ; Dann geht es in eine Schleife, wo jeweils mit tl_wait() 2 Sekunden gewartet wird.
-
- modulstart: move.l SP,stackpuffer ; der Stackpuffer wird gesichert und erst in der
- ; in der Routine Ende für's zurück
- ; springen wieder restauriert. Damit kann
- ; man dann auch aus verschachtelten Unterroutinen
- ; jederzeit beim Schonende zurückspringen
- movea.l 4(SP),A0 ; Holt die Adresse der tl_info-structur
- movea.l _tl_check(A0),A1 ; Adresse der TL_CHECK-Routine
- movea.l _tl_wait(A0),A2 ; Adresse von tl_wait
- jsr (A1) ; Soll noch geschont werden? Gleichzeitig wird hier auf einen VSYNC gewartet (Siehe Modulkopf)
- bmi.s ende ; In D0 ist der Rückgabewert, gleichzeitig wird aber auch das N-Flag entsprechend gesetzt
- ; Daher kann man sich einen Test sparen.
-
- schleife: move.w #20,-(SP) ; 20 zehntel-Sekunden warten
- jsr (A2) ; tl_wait aufrufen
- bmi.s ende ; Auch wieder in D0 und N-Flag Rückgabewert
- addq.l #2,SP ; Stackkorrektur
- bra.s schleife
-
-
-
- ende: movea.l stackpuffer(PC),SP ; Stack wieder restaurieren
- moveq #0,D0 ; Rückgabewert des Moduls, alles OK
- rts ; und zurückspringen
- ENDPART
-
- BSS
- stackpuffer: DS.L 1 ; Zwischenspeicher für den Stack
- END
-